// CancelToken 它是一个类，用于取消当前的请求
import axios, { CancelToken } from 'axios'
// 引入配置文件
import { timeout, apiHost } from '@/config/site'


// 多实例来使用axios对象
const instance = axios.create({
    baseURL: apiHost,
    timeout
})

const cancelTaskMap = new Map()

// 取消所有的存储在Map集合中的表求
const cancelTaskAllAction = () => {
    cancelTaskMap.forEach(task => task())

    // 清空集合
    cancelTaskMap.clear()
}

// 响应拦截器，把data解出来
instance.interceptors.response.use(
    ret => {
        if (ret.status === 200) {
            // Message.success('请求成功')
        }
        return ret.data
    },
    err => Promise.reject(err)
)

// 请求拦截器
instance.interceptors.request.use(config => {
    // 只要你有请求我就会先执行它
    // 取消现在正在执行的动作
    cancelTaskAllAction()
    // 添加
    config.cancelToken = new CancelToken(fn => cancelTaskMap.set(config.url, fn))

    return config
})

// 封装方法 get/post
/**
 * get请求方法
 * @param {string} url 请求的url地址 /api/xxx
 * @param {object} config 针对于当前的请求添加的额外请求头信息 {headers:{token:'xxx'}}
 * @returns Promise<any>
 */
export const get = (url, config = {}) => instance.get(url, config)

/**
 * post请求方法
 * @param {string} url 请求的url地址 /api/xxx
 * @param {object} data 请求体数数据 {name:'aa'}
 * @param {object} config 针对于当前的请求添加的额外请求头信息 {headers:{token:'xxx'}}
 * @returns Promise<any>
 */
export const post = (url, data = {}, config = {}) => instance.post(url, data, config)
